Fortran For Fun 并行之Co-Array Fortran (CAF)

Fortran2008及之后版本的主要提升在于混合编程和并行编程,并行编程通过coarray实现,想将Fortran的并行操作变成与数组操作一样简单,将Fortran变为一个天然的并行编程语言。

目前的fortran编译器基本上都内在的支持coarray,只需要在编译选项中添加一些选项就可以编译coarray程序。对gfortran, 添加选项

1
-fcoarray=lib -lcaf_mpi

对intel fortran添加选项

1
-coarray

hello_coarray

1
2
3
4
5
6
7
8
program hello_coarray
implicit none
if(this_image() == 1) write(*,'(a,i0)') 'total images ',num_images()
write(*,'(a,i0,a)') 'image ',this_image(), ' say hello coarray '
end program hello_coarray

结果

执行 cafrun -n 4 hello_coarray 或 mpirun -n 4 hello_coarray ,得到

1
2
3
4
5
total images 4
image 1 say hello coarray
image 2 say hello coarray
image 3 say hello coarray
image 4 say hello coarray

coarray

1
2
3
4
5
6
7
8
9
10
11
12
13
program coarray
implicit none
integer, allocatable :: iv(:)[:] !< a vector coarray
integer :: i,j
allocate(iv(4)[*])
do i = 1,num_images()
iv(:)[i] = [(j+i-1,j=1,4)]
if(this_image()==i) print'(a,i0,a,*(i0,3x))', 'iamges-', i,':',iv
enddo
end program coarray

程序中iv就是一个coarray,可以在每一个镜像中对coarray赋值。

结果

执行 cafrun -n 4 hello_coarray 或 mpirun -n 4 hello_coarray ,得到

1
2
3
4
iamges-1:1 2 3 4
iamges-2:2 3 4 5
iamges-3:3 4 5 6
iamges-4:4 5 6 7

openCoarrays